﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Entities;
using RRHH.Competencias.Controladores;

namespace WebSite
{
    public partial class Cursos : System.Web.UI.Page
    {
        protected string codigoPantalla = "CURSOS";

        protected void Page_Load ( object sender, EventArgs e )
        {

            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                MpeDetalleCurso.Hide();

                btnCancelar.Attributes.Add( "onclick", "return confirm('Está seguro que desea cancelar la operación');" );

                Session["ABMCursos.GrdCursos.Indice"] = null;
                Session["ABMCursos.GrdCapacidadesDisponibles.Indice"] = null;
                Session["ABMCursos.GrdCapacidadesAsignadas.Indice"] = null;

                Session["ABMCursos.lsCursos"] = null;
                Session["ABMCursos.lsCapacidadesDisponibles"] = null;
                Session["ABMCursos.lsCapacidadesAsignadas"] = null;

                Session["ABMCursos.CursoUpdate"] = null;

                try
                {
                    BuscarDatos();
                    CargarTiposCurso();
                }
                catch (Exception)
                {
                    
                }
            }
        }

        protected void GrdCursos_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila = 0;

            List<Curso> lsCursos = new List<Curso>();
            lsCursos = (List<Curso>)Session["ABMCursos.lsCursos"];

            GestorCurso gestorCurso = new GestorCurso();
            Curso cursoUpdate = new Curso();

            indiceFila = Convert.ToInt16( e.CommandArgument );
            long cursoId = long.Parse( GrdCursos.DataKeys[indiceFila].Values["Id"].ToString() );

            foreach (Curso curso in lsCursos)
            {
                if (curso.Id == cursoId)
                {
                    cursoUpdate = curso;
                    //Si el curso tiene capacidades las limpio, de lo contrario las agrega repetidas en el gridview
                    if (cursoUpdate.Capacidades != null) cursoUpdate.Capacidades.Clear();

                    Session["ABMCursos.CursoUpdate"] = cursoUpdate;
                    break;
                }
            }

            switch (e.CommandName)
            {
                case "Modificar":
                    try
                    {
                        EstadoInterfaz( "Edicion" );
                        CompletarCampos( cursoUpdate );
                    }
                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error", "No se pudo completar la informacion del curso");
                    }

                    break;

                case "Desactivar":
                    try
                    {
                        gestorCurso.Desactivar( cursoUpdate );
                        BuscarDatos();
                    }
                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error", "No se pudo desactivar el curso");
                    }

                    break;

                case "Activar":
                    try
                    {
                        gestorCurso.Activar( cursoUpdate );
                        BuscarDatos();
                    }
                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript( "Error", "No se pudo activar el curso" );
                    }

                    break;
            }
        }

        protected void GrdCursos_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            LinkButton lnkButtonActDes;
            LinkButton lnkButtonModificar;

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                lnkButtonModificar = (LinkButton)e.Row.Cells[8].Controls[0];
                lnkButtonModificar.Text = "Modificar";

                lnkButtonActDes = (LinkButton)e.Row.Cells[9].Controls[0];

                //La fechaBaja es nula
                if (DateTime.Parse( e.Row.Cells[10].Text ) != DateTime.MinValue)
                {
                    lnkButtonActDes.Text = "Activar";
                    lnkButtonActDes.CommandName = "Activar";
                }
                else
                {
                    lnkButtonActDes.Text = "Desactivar";
                    lnkButtonActDes.CommandName = "Desactivar";
                    lnkButtonActDes.Attributes.Add( "onclick", "if (!confirm('Está seguro que desea desactivar el curso?'))return false;" );
                }
                //Oculto la columna que muestra la Fecha de Baja
                e.Row.Cells[10].Visible = false;
            }
        }

        protected void btnBuscar_Click ( object sender, EventArgs e )
        {
            try
            {
                BuscarDatos();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la informacion de los cursos" );
            }
        }

        protected void btnNuevo_Click ( object sender, EventArgs e )
        {
            EstadoInterfaz( "Nuevo" );
        }

        protected void btnAceptar_Click ( object sender, EventArgs e )
        {
            string errores = string.Empty;

            if (!ValidarDatos( out errores ))
            {
                this.RegistrarMensajeJavascript( "Error", errores );
                return;
            }

            GestorCurso gestorCurso = new GestorCurso();
            Curso curso = new Curso();
            List<CapacidadCurso> capacidadesCurso = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];

            try
            {
                if (!string.IsNullOrEmpty( txtCodigo.Text )) curso.Id = long.Parse( txtCodigo.Text );
                curso.Nombre = txtNombre.Text;
                curso.Descripcion = txtDescripcion.Text;
                if (!string.IsNullOrEmpty( txtCantidadHoras.Text )) curso.CantidadHoras = short.Parse( txtCantidadHoras.Text );
                if (!string.IsNullOrEmpty( txtFechaInicio.Text )) curso.FechaInicio = DateTime.Parse( txtFechaInicio.Text );
                if (!string.IsNullOrEmpty( txtFechaFin.Text )) curso.FechaFin = DateTime.Parse( txtFechaFin.Text );
                if (!string.IsNullOrEmpty( txtCodigoResponsableDictado.Text )) curso.ResponsableDictado = new Persona( long.Parse( txtCodigoResponsableDictado.Text ),
                                                                                                                      txtNombreResponsableDictado.Text,
                                                                                                                      string.Empty );
                curso.ResponsablePropuesta = new Colaborador( long.Parse( txtCodigoResponsablePropuesta.Text ) );
                curso.Tipo = new TipoCurso( long.Parse( DdlTipo.SelectedValue.ToString() ), DdlTipo.DataTextField, string.Empty );

                foreach (CapacidadCurso capacidadCurso in capacidadesCurso)
                {
                    curso.AgregarCapacidad( capacidadCurso );
                }

                if (curso.Id > 0)
                {
                    gestorCurso.Modificar( curso );
                }
                else
                {
                    gestorCurso.Registrar( curso );
                }

                this.RegistrarMensajeJavascript( "Error", "La operación se registró correctamente" );

                MpeDetalleCurso.Hide();

                this.BuscarDatos();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo registrar la operación" );
            }
        }

        protected void btnCancelar_Click ( object sender, EventArgs e )
        {
            EstadoInterfaz( "Busqueda" );

        }

        protected void btnCerrar_Click ( object sender, EventArgs e )
        {
            MpeDetalleCurso.Hide();
        }


        protected void GrdCapacidadesAsignadas_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            List<CapacidadCurso> lsCapacidadesAsignadas = new List<CapacidadCurso>();

            if (Session["ABMCursos.lsCapacidadesAsignadas"] != null)
            {
                lsCapacidadesAsignadas = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];
            }

            GrdCapacidadesAsignadas.DataSource = lsCapacidadesAsignadas;
            GrdCapacidadesAsignadas.DataKeyNames = new string[] { "CapacidadId" };
            GrdCapacidadesAsignadas.PageIndex = e.NewPageIndex;
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowCancelingEdit ( object sender, GridViewCancelEditEventArgs e )
        {
            GrdCapacidadesAsignadas.EditIndex = -1;

            GrdCapacidadesAsignadas.DataSource = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];
            GrdCapacidadesAsignadas.PageIndex = Convert.ToInt32( Session["ABMCursos.GrdCapacidadesAsignadas.Indice"] );
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila = 0;

            if (e.CommandName.Equals( "Quitar" ))
            {
                indiceFila = Convert.ToInt32( e.CommandArgument );

                CapacidadCurso capacidadBorrar = new CapacidadCurso( null );

                List<CapacidadCurso> lstCapacidadesAsignadas = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];

                long idCapacidad = long.Parse( GrdCapacidadesAsignadas.DataKeys[indiceFila].Values["CapacidadId"].ToString() );

                foreach (CapacidadCurso capacidadCurso in lstCapacidadesAsignadas)
                {
                    if (capacidadCurso.Capacidad.Id == idCapacidad)
                    {
                        capacidadBorrar = capacidadCurso;
                        break;
                    }
                }

                lstCapacidadesAsignadas.Remove( capacidadBorrar );

                GrdCapacidadesAsignadas.DataSource = lstCapacidadesAsignadas;
                GrdCapacidadesAsignadas.DataBind();

                Session["ABMCursos.lsCapacidadesAsignadas"] = lstCapacidadesAsignadas;

                lblCantidadCapacidadesAsignadas.Text = lstCapacidadesAsignadas.Count.ToString();
            }

        }

        protected void GrdCapacidadesAsignadas_RowEditing ( object sender, GridViewEditEventArgs e )
        {
            GrdCapacidadesAsignadas.EditIndex = e.NewEditIndex;

            GrdCapacidadesAsignadas.DataSource = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];
            //GrdCapacidadesAsignadas.PageIndex = GrdCapacidadesAsignadas.PageIndex;
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowUpdating ( object sender, GridViewUpdateEventArgs e )
        {

            long capacidadIdActual = Convert.ToInt64( GrdCapacidadesAsignadas.DataKeys[e.RowIndex].Values["CapacidadId"] );

            

            DropDownList DdlNivelMinimo = (DropDownList)GrdCapacidadesAsignadas.Rows[e.RowIndex].FindControl( "DdlNivelMinimo" );

            List<CapacidadCurso> lscapacidadCurso = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];
            CapacidadCurso capacidadActualizar = null;

            foreach (CapacidadCurso item in lscapacidadCurso)
            {
                if (item.Capacidad.Id == capacidadIdActual)
                {
                    capacidadActualizar = item;
                    break;
                }
            }

            if (capacidadActualizar == null) capacidadActualizar = new CapacidadCurso( null );

            if (!string.IsNullOrEmpty( DdlNivelMinimo.SelectedValue ))
                capacidadActualizar.NivelMinimo = new NivelCapacidad( Convert.ToInt64( DdlNivelMinimo.SelectedValue ), DdlNivelMinimo.SelectedItem.ToString(), string.Empty );

            
            DropDownList DdlNivelMaximo = (DropDownList)GrdCapacidadesAsignadas.Rows[e.RowIndex].FindControl( "DdlNivelMaximo" );

            foreach (CapacidadCurso item in lscapacidadCurso)
            {
                if (item.Capacidad.Id == capacidadIdActual)
                {
                    capacidadActualizar = item;
                    break;
                }
            }

            if (capacidadActualizar == null) capacidadActualizar = new CapacidadCurso( null );

            if (!string.IsNullOrEmpty( DdlNivelMaximo.SelectedValue ))
                capacidadActualizar.NivelMaximo = new NivelCapacidad( Convert.ToInt64( DdlNivelMaximo.SelectedValue ), DdlNivelMaximo.SelectedItem.ToString(), string.Empty );

            
            DropDownList DdlNivelEsperado = (DropDownList)GrdCapacidadesAsignadas.Rows[e.RowIndex].FindControl( "DdlNivelEsperado" );

            foreach (CapacidadCurso item in lscapacidadCurso)
            {
                if (item.Capacidad.Id == capacidadIdActual)
                {
                    capacidadActualizar = item;
                    break;
                }
            }

            if (capacidadActualizar == null) capacidadActualizar = new CapacidadCurso( null );

            if (!string.IsNullOrEmpty( DdlNivelEsperado.SelectedValue ))
                capacidadActualizar.NivelEsperado = new NivelCapacidad( Convert.ToInt64( DdlNivelEsperado.SelectedValue ), DdlNivelEsperado.SelectedItem.ToString(), string.Empty );

            

            GrdCapacidadesAsignadas.EditIndex = -1;

            GrdCapacidadesAsignadas.DataSource = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];            
            GrdCapacidadesAsignadas.DataBind();
        }

        protected void GrdCapacidadesAsignadas_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            
            CapacidadCurso capacidadCurso = (CapacidadCurso)e.Row.DataItem;

            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    GestorEnumerador<NivelCapacidad> gestorNivel = new GestorEnumerador<NivelCapacidad>();
                    List<NivelCapacidad> lstNivelCapacidad = gestorNivel.Enumeracion;

                    if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                    {
                        DropDownList ddlNivelMinimo = (DropDownList)e.Row.FindControl( "DdlNivelMinimo" );
                        ddlNivelMinimo.DataSource = lstNivelCapacidad;
                        ddlNivelMinimo.DataTextField = "Nombre";
                        ddlNivelMinimo.DataValueField = "Id";
                        ddlNivelMinimo.DataBind();

                        ddlNivelMinimo.SelectedValue = capacidadCurso.NivelMinimo.Id.ToString();

                        DropDownList ddlNivelMaximo = (DropDownList)e.Row.FindControl( "DdlNivelMaximo" );
                        ddlNivelMaximo.DataSource = lstNivelCapacidad;
                        ddlNivelMaximo.DataTextField = "Nombre";
                        ddlNivelMaximo.DataValueField = "Id";
                        ddlNivelMaximo.DataBind();

                        ddlNivelMaximo.SelectedValue = capacidadCurso.NivelMaximo.Id.ToString();

                        DropDownList ddlNivelEsperado = (DropDownList)e.Row.FindControl( "DdlNivelEsperado" );
                        ddlNivelEsperado.DataSource = lstNivelCapacidad;
                        ddlNivelEsperado.DataTextField = "Nombre";
                        ddlNivelEsperado.DataValueField = "Id";
                        ddlNivelEsperado.DataBind();

                        ddlNivelEsperado.SelectedValue = capacidadCurso.NivelEsperado.Id.ToString();
                    }

                    //Cortamos nombre y descripcion a 20 caracteres
                    if (e.Row.Cells[1].Text.Length > 20)
                    {
                        e.Row.Cells[1].Text = e.Row.Cells[1].Text.Substring( 0, 20 ) + "...";
                    }

                    if (e.Row.Cells[2].Text.Length > 20)
                    {
                        e.Row.Cells[2].Text = e.Row.Cells[2].Text.Substring( 0, 20 ) + "...";
                    }
                }
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información de los niveles de capacidades" );
            }
        }


        protected void GrdCapacidadesDisponibles_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            int indiceFila = 0;

            if (e.CommandName.Equals( "Agregar" ))
            {
                try
                {
                    GrdCapacidadesAsignadas_RowCancelingEdit( null, null );

                    //Capacidad capacidadBorrar = new Capacidad();
                    List<Capacidad> lsCapacidadesDisponibles = (List<Capacidad>)Session["ABMCursos.lsCapacidadesDisponibles"];
                    List<CapacidadCurso> lsCapacidadesAsignadas = (List<CapacidadCurso>)Session["ABMCursos.lsCapacidadesAsignadas"];

                    indiceFila = Convert.ToInt32( e.CommandArgument );
                    long idCapacidad = long.Parse( GrdCapacidadesDisponibles.DataKeys[indiceFila].Values["Id"].ToString() );

                    foreach (Capacidad capacidad in lsCapacidadesDisponibles)
                    {
                        if (capacidad.Id == idCapacidad)
                        {
                            if (lsCapacidadesAsignadas == null) lsCapacidadesAsignadas = new List<CapacidadCurso>();

                            CapacidadCurso capacidadCurso = new CapacidadCurso( capacidad );

                            if (!lsCapacidadesAsignadas.Contains( capacidadCurso ))
                            {


                                //Completar los niveles de capacidades
                                GestorEnumerador<NivelCapacidad> gestorEnum = new GestorEnumerador<NivelCapacidad>();
                                List<NivelCapacidad> lsNivelCapacidad = gestorEnum.Enumeracion;

                                NivelCapacidad nivelCapacidad = lsNivelCapacidad[0];  //Nivel de capacidad por defecto

                                capacidadCurso.NivelMinimo = nivelCapacidad;
                                capacidadCurso.NivelMaximo = nivelCapacidad;
                                capacidadCurso.NivelEsperado = nivelCapacidad;

                                lsCapacidadesAsignadas.Add( capacidadCurso );
                                //capacidadBorrar = capacidad;
                            }
                        }
                    }

                    GrdCapacidadesAsignadas.DataSource = lsCapacidadesAsignadas;
                    GrdCapacidadesAsignadas.DataKeyNames = new string[] { "CapacidadId" };
                    GrdCapacidadesAsignadas.PageIndex = GrdCapacidadesAsignadas.PageCount;
                    GrdCapacidadesAsignadas.DataBind();

                    Session["ABMCursos.lsCapacidadesAsignadas"] = lsCapacidadesAsignadas;

                    lblCantidadCapacidadesAsignadas.Text = lsCapacidadesAsignadas.Count.ToString();
                }
                catch (Exception)
                {
                    this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información de las capacidades" );
                }
            }
        }

        protected void GrdCapacidadesDisponibles_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            Session["ABMCursos.GrdCapacidadesDisponibles.Indice"] = e.NewPageIndex;
            BuscarCapacidadesDisponibles();
        }

        protected void btnBuscarCapacidad_Click ( object sender, EventArgs e )
        {
            BuscarCapacidadesDisponibles();
        }

        protected void GrdCapacidadesDisponibles_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //Cortamos nombre y descripcion a 20 caracteres
                if (e.Row.Cells[1].Text.Length > 20)
                {
                    e.Row.Cells[1].Text = e.Row.Cells[1].Text.Substring( 0, 20 ) + "...";
                }

                if (e.Row.Cells[2].Text.Length > 20)
                {
                    e.Row.Cells[2].Text = e.Row.Cells[2].Text.Substring( 0, 20 ) + "...";
                }
            }
        }

        #region Metodos de la clase ABMCursos
        
        private void BuscarDatos ()
        {
            
            if (Session["ABMCursos.GrdCursos.Indice"] == null) Session["ABMCursos.GrdCursos.Indice"] = 0;

            List<Curso> cursos = new List<Curso>();

            GestorColaborador gestorColaborador = new GestorColaborador();
            GestorCurso gestorCurso = new GestorCurso();

            try
            {
                cursos = gestorCurso.Buscar( null, txtNombreCursoBuscar.Text, txtDescripcionCursoBuscar.Text, null, null, null, null, null, chkActivo.Checked );
                GrdCursos.DataKeyNames = new string[] { "Id" };

                GrdCursos.DataSource = cursos;
                GrdCursos.PageIndex = Convert.ToInt32( Session["ABMCursos.GrdCursos.Indice"] );
                GrdCursos.DataBind();

                Session["ABMCursos.lsCursos"] = cursos;

                UpdListadoCursos.Update();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript("Error","No se pudo obtener la información de los cursos");
            }
            

        }

        private void CargarTiposCurso ()
        {
            TipoCurso tipoCurso = new TipoCurso();

            try
            {

                GestorEnumerador<TipoCurso> gEnumTipoCurso = new GestorEnumerador<TipoCurso>(  );
                List<TipoCurso> lsTipoCurso = gEnumTipoCurso.Enumeracion;

                tipoCurso.Id = -1;
                tipoCurso.Nombre = "Seleccionar";
                lsTipoCurso.Insert( 0, tipoCurso );

                DdlTipo.DataSource = lsTipoCurso;
                DdlTipo.DataTextField = "Nombre";
                DdlTipo.DataValueField = "Id";
                DdlTipo.DataBind();

            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información de los tipos de curso" );
            }


        }

        protected void EstadoInterfaz ( string estado )
        {

            btnAceptar.Visible = true;
            btnCancelar.Visible = true;
            btnCerrar.Visible = false;

            
            switch (estado)
            {
                case "Busqueda":

                    MpeDetalleCurso.Hide();
                    Session["ABMCursos.lsCapacidadesAsignadas"] = null;
                    Session["ABMCursos.CursoUpdate"] = null;
                    GrdCapacidadesAsignadas.DataSource = null;
                    GrdCapacidadesAsignadas.DataBind();
                    GrdCapacidadesAsignadas_RowCancelingEdit( null, null );

                    break;


                case "Nuevo":

                    LimpiarCampos();

                    Session["ABMCursos.GrdCapacidadesDisponibles.Indice"] = null;
                    Session["ABMCursos.GrdCapacidadesAsignadas.Indice"] = null;
                    Session["ABMCursos.lsCapacidadesAsignadas"] = null;

                    BuscarCapacidadesDisponibles();

                    DdlTipo.Enabled = true;

                    MpeDetalleCurso.Show();
                    break;

                case "Edicion":

                    DdlTipo.Enabled = false;
                    MpeDetalleCurso.Show();
                    LimpiarCampos();
                    break;

            }
        }

        private void CompletarCampos ( Curso curso )
        {
            txtCodigo.Text = curso.Id.ToString();
            txtNombre.Text = curso.Nombre;
            txtDescripcion.Text = curso.Descripcion;
            DdlTipo.SelectedValue = curso.Tipo.Id.ToString();
            txtCantidadHoras.Text = curso.CantidadHoras.ToString();
            txtFechaInicio.Text = curso.FechaInicio.ToShortDateString();
            if (!curso.FechaFin.Equals( DateTime.MinValue )) txtFechaFin.Text = curso.FechaFin.ToShortDateString();

            if (curso.ResponsablePropuesta.Id > 0)
            {
                txtCodigoResponsablePropuesta.Text = curso.ResponsablePropuesta.IdColaborador.ToString();
                txtNombreResponsablePropuesta.Text = curso.ResponsablePropuesta.Nombre + " " + curso.ResponsablePropuesta.Apellido;
            }

            if (curso.ResponsableDictado.Nombre != string.Empty)
            {
                txtCodigoResponsableDictado.Text = curso.ResponsableDictado.Id.ToString();
                txtNombreResponsableDictado.Text = curso.ResponsableDictado.Nombre + " " + curso.ResponsableDictado.Apellido;
            }

            BuscarCapacidadesAsignadas( curso );
            BuscarCapacidadesDisponibles();

        }

        protected void BuscarCapacidadesDisponibles ()
        {
            
            if (Session["ABMCursos.GrdCapacidadesDisponibles.Indice"] == null)
            {
                Session["ABMCursos.GrdCapacidadesDisponibles.Indice"] = 0;
            }

            GestorCapacidad gestorCapacidad = new GestorCapacidad(  );
            List<Capacidad> lstCapacidades = new List<Capacidad>();

            try
            {
                lstCapacidades = gestorCapacidad.Buscar( null, txtBuscarCapacidad.Text, null, null, true );

                GrdCapacidadesDisponibles.DataKeyNames = new string[] { "Id" };

                GrdCapacidadesDisponibles.DataSource = lstCapacidades;
                GrdCapacidadesDisponibles.PageIndex = Convert.ToInt32( Session["ABMCursos.GrdCapacidadesDisponibles.Indice"] );
                GrdCapacidadesDisponibles.DataBind();

                Session["ABMCursos.lsCapacidadesDisponibles"] = lstCapacidades;
                lblCantidadCapacidadesDisponibles.Text = lstCapacidades.Count.ToString();
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información de las capacidades disponibles" );
            }


        }

        protected void BuscarCapacidadesAsignadas ( Curso curso )
        {
            
            GrdCapacidadesAsignadas.DataSource = null;
            GrdCapacidadesAsignadas.DataBind();

            try
            {
                if (Session["GrdCapacidadesAsignadas.Indice"] == null)
                {
                    Session["GrdCapacidadesAsignadas.Indice"] = 0;
                }

                GestorCurso gestorCurso = new GestorCurso(  );
                gestorCurso.Completar( curso );

                GrdCapacidadesAsignadas.DataKeyNames = new string[] { "CapacidadId" };

                GrdCapacidadesAsignadas.DataSource = curso.Capacidades;
                GrdCapacidadesAsignadas.PageIndex = Convert.ToInt32( Session["GrdCapacidadesAsignadas.Indice"] );

                GrdCapacidadesAsignadas.DataBind();

                Session["ABMCursos.lsCapacidadesAsignadas"] = curso.Capacidades;

            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información de las capacidades asignadas" );
            }
        }

        private void LimpiarCampos ()
        {
            txtCodigo.Text = string.Empty;
            txtNombre.Text = string.Empty;
            txtDescripcion.Text = string.Empty;
            if (DdlTipo.Items.Count > 0) DdlTipo.SelectedIndex = 0;
            txtCodigoResponsableDictado.Text = string.Empty;
            txtNombreResponsableDictado.Text = string.Empty;
            txtCodigoResponsablePropuesta.Text = string.Empty;
            txtNombreResponsablePropuesta.Text = string.Empty;
            txtFechaInicio.Text = string.Empty;
            txtFechaFin.Text = string.Empty;
            txtBuscarCapacidad.Text = string.Empty;
        }

        protected bool ValidarDatos ( out string errores )
        {
            errores = string.Empty;
            DateTime fecha;
            int numerico;

            if (string.IsNullOrEmpty( txtNombre.Text ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar el nombre del curso" );
                return false;
            }

            if (string.IsNullOrEmpty( txtDescripcion.Text ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar el descripcion del curso" );
                return false;
            }

            if (string.IsNullOrEmpty( txtNombreResponsablePropuesta.Text ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar el responsable de la propuesta del curso" );
                return false;
            }

            if (string.IsNullOrEmpty( txtNombreResponsableDictado.Text ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar el responsable del dictado del curso" );
                return false;
            }

            if (Convert.ToInt32( DdlTipo.SelectedValue ) == 0)
            {
                this.RegistrarMensajeJavascript( "Error", "Debe seleccionar el tipo de curso" );
                return false;
            }

            if (!string.IsNullOrEmpty( txtFechaInicio.Text ) && !DateTime.TryParse( txtFechaInicio.Text, out fecha ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar una fecha de inicio del curso valida" );   
                return false;
            }

            if (!string.IsNullOrEmpty( txtFechaFin.Text ) && !DateTime.TryParse( txtFechaFin.Text, out fecha ))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar una fecha de fin del curso valida" );
                return false;
            }

            if ((!string.IsNullOrEmpty( txtCantidadHoras.Text )) && (!int.TryParse( txtCantidadHoras.Text, out numerico )))
            {
                this.RegistrarMensajeJavascript( "Error", "Debe indicar una duración en horas del curso valida" );
                return false;
            }

            if (GrdCapacidadesAsignadas.Rows.Count == 0)
            {
                this.RegistrarMensajeJavascript( "Error", "Debe asignar al menos una capacidad al curso" );
                return false;
            }

            return true;
        }

        private void RegistrarMensajeJavascript ( string nombre, string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            ScriptManager.RegisterStartupScript( this, this.GetType(), nombre, "alert('" + mensaje + "');", true );
        }

        #endregion
    }
}